package de.fhd.pms.ctrl;

import java.util.Date;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import de.fhd.pms.dao.StandortDao;
import de.fhd.pms.model.Standort;

/**
 * Controller von Standort.
 * <p>
 * Der StandortController übernimmt die Ablaufsteuerung für das Handling von
 * Standorten (z. B. Userinput).
 * 
 * @author Martin Schmid
 * @author Florian Schachner
 */
@Controller
public class StandortController {
	private static Logger log = Logger.getLogger(StandortController.class);

	// Schritt 2: Definition einer DAO-Instanz vom Typ der Klasse TeilnehmerDao
	private StandortDao standortDao = null;

	// Schritt 3: setTeilnehmerDao-Methode:
	// Hier greift das IoC-Prinzip (Hollywood-Prinzip)
	// "Ich erwarte, das mir jemand dieses Objekt mitgibt"

	/**
	 * SetStandortDao-Methode von StandortController.
	 * <p>
	 * Hier wird der Input des Benutzers für einen Standort und für das Model
	 * gemappt.
	 * 
	 * @param standortDao
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	public void setStandortDao(StandortDao standortDao) {
		this.standortDao = standortDao;
	}

	// Schritt 4: Definition einer save-Methode, die als Parameter einen
	// Standort und ein Model übergeben erhält,
	// um mithilfe der zuvor angelegten save-Methode der Dao-Instanz einen
	// Standort in der Datenbank abzuspeichern.
	// Durch die Angabe der Annotation @RequestMapping reagiert diese Methode
	// nur auf den Befehl "/EditStandort.html" per URL-Eingabe.
	// Mit der method=RequestMethod.Get werden die Bestandteile (Parameter) der
	// URL umgewandelt in ein Standort-Objekt

	/**
	 * Edit-Methode von StandortController.
	 * <p>
	 * Hierbei wird es ermöglicht, bestehende Standorte abzuändern bzw. zu
	 * editieren.
	 * <p>
	 * Reagiert auf einen HTTP-Request '/EditStandort.html'.
	 * 
	 * @param id
	 *            - Integer
	 * @return Gibt ein Objekt vom Typ {@link ModelAndView} ("EditStandort")
	 *         zurück.
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	@RequestMapping(value = "/EditStandort.html", method = RequestMethod.GET)
	public ModelAndView edit(@RequestParam(required = false) Integer id) {
		log.info("STANDORTCONTROLLER: EditStandort.html");
		ModelAndView mv = new ModelAndView();
		if (id == null) {
			mv.addObject(new Standort());
		} else {
			mv.addObject(standortDao.findById(id));
		}

		if (id == null) {
			mv.addObject("title", "Standort anlegen");
			mv.addObject(
					"message",
					"Mithilfe dieses Eingabeformulars können neue Standorte im CarSharing-Projekt angelegt werden.");
		} else {
			mv.addObject("title", "Standortdaten ändern");
			mv.addObject(
					"message",
					"Mithilfe dieses Eingabeformulars können die Daten zu einem Standort geändert werden.");
		}

		mv.setViewName("editStandort");
		return mv;
	}

	/**
	 * Save-Mehtode von StandortController.
	 * <p>
	 * Hierbei wird ein anzulegender Standort anhand der Benutzereingaben
	 * gespeichert. Der Input wird an die entsprechende DAO-Instanz
	 * weitergegeben.
	 * <p>
	 * Reagiert auf einen HTTP-Request '/SaveStandort.html'.
	 * 
	 * @param standort
	 *            Ein Objekt der Klasse {@link Standort}
	 * @param model
	 * @return Einen Redirect mit dem Befehl 'AlleStandorte.html'
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	@RequestMapping(value = "/SaveStandort.html", method = RequestMethod.POST)
	public String save(Standort standort, Model model) {
		log.info("SaveTeilnehmer.html");

		if (standort.getCreated() == null) {
			standort.setCreated(new Date());
		}
		Standort result = standortDao.save(standort);
		// set id from create
		if (standort.getId() == null) {
			standort.setId(result.getId());
		}
		model.addAttribute("statusMessageKey", "standort.form.msg.success");
		return "redirect:AlleStandorte.html";
	}

	/**
	 * FindAll-Methode von StandortController.
	 * <p>
	 * Hierbei wird es ermöglicht, alle angelegten Standorte in der Datenbank
	 * auszulesen.
	 * <p>
	 * Diese Methode reagiert auf den Befehl '/AlleStandorte.html'. Sie liefert
	 * alle Standorte aus der Datenbank zurück. Alle gefundenen Standorte werden
	 * dem ModelAndView-Objekt hinzugefügt. Abschließend wird die View mit Namen
	 * "listStandorte" aufgerufen.
	 * 
	 * @return Gibt ein Objekt vom Typ {@link ModelAndView} ("listStandort")
	 *         zurück.
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	@RequestMapping(value = "/AlleStandorte.html", method = RequestMethod.GET)
	public ModelAndView findAll() {
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Alle Standorte im CarSharing-Projekt");
		mv.addObject("message",
				"Anzeige aller im CarSharing-Projekt verfügbaren Standorte.");
		mv.addObject("standort", standortDao.findAll());
		mv.setViewName("listStandort");
		return mv;
	}

	/**
	 * Delete-Methode von StandortController.
	 * <p>
	 * Hierbei wird es ermöglicht, bestehende Standorte aus der Datenbank zu
	 * löschen.
	 * <p>
	 * Diese Methode reagiert auf den Befehl '/LoescheStandort.html'. Sie löscht
	 * den ausgewählten Standort aus der Datenbank. Abschließend wird die View
	 * mit Namen "AlleStandorte" aktualisiert bzw. aufgerufen.
	 * 
	 * @param standort
	 *            - in Objekt der Klasse {@link Standort}
	 * @return Einen Redirect mit dem Befehl 'AlleStandorte.html'
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	@RequestMapping(value = "/LoescheStandort.html", method = RequestMethod.GET)
	public ModelAndView delete(Standort standort) {
		standortDao.delete(standort);
		return new ModelAndView("redirect:AlleStandorte.html");
	}

	/**
	 * DisplaySingeStandort-Methode von StandortController.
	 * <p>
	 * Hierbei wird es ermöglicht, einen speziellen bzw. einzelnen Standort
	 * mittels einer Map darzustellen.
	 * <p>
	 * Diese Methode reagiert auf den Befehl '/DisplayStandort.html'. Sie zeigt
	 * den ausgewählten Standort an. Abschließend wird die View mit Namen
	 * "displayStandort" aufgerufen.
	 * 
	 * @param standort
	 *            - in Objekt der Klasse {@link Standort}
	 * @return Gibt ein Objekt vom Typ {@link ModelAndView} ("displayStandort")
	 *         zurück.
	 * @author Martin Schmid
	 * @author Florian Schachner
	 */
	@RequestMapping(value = "/DisplayStandort.html", method = RequestMethod.GET)
	public ModelAndView displaySingleStandort(Standort standort) {

		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Standort anzeigen");
		mv.addObject("message",
				"Anzeige eines individuellen Standortes mit Visualisierung in einer Map.");
		mv.addObject("standort", standortDao.findById(standort.getId()));
		mv.setViewName("displayStandort");

		return mv;
	}

}
